const zero: number = 0
const positivenumber: number[] = [1, 2, 3, 4,]
const negativenumber: number[] = [-1, -2, -3, -4]
let number: number[] = negativenumber.concat(zero, positivenumber)//用concat产生新数组进行连接。

//迭代器函数
//js内部提供了很多的迭代方法，其实就是封装的一个函数。
function isEven(x: number): boolean {
    //判断x是否为偶数
    return x % 2 == 0 ? true : false
}
let numberarray: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
//简化代码，用箭头函数
const isEven1 = (x: number) => x % 2 == 0
//数组的every方法，判断数组中的元素是否都满足条件
numberarray.every(isEven1)//返回false，全是true才是true


numberarray.some(isEven1)//返回true，全是false才是false


//foreach方法，遍历数组，里面接一个回调。所有元素执行一遍这个回调。
numberarray.forEach((x, index) => console.log(x % 2 == 0, index))//遍历数组，并打印出结果


//两个返回新数组的迭代方法。
//map方法，遍历数组，里面接一个回调。所有元素执行一遍这个回调，返回一个新的数组。
let newarr: boolean[] = numberarray.map(isEven1)


//filter方法，遍历数组，里面接一个回调。所有元素执行一遍这个回调，返回一个新的数组。
let newarr2: number[] = numberarray.filter(isEven1)



//reduce方法，遍历数组。里面接一个累加属性，有四个参数。
let sum = numberarray.reduce((x, y) => x + y)
console.log(sum);

//es6和数组的新功能
//1.使用for....of迭代循环
for (const n in numberarray) {
    console.log(n);
}

//2.使用@@iterator对象
let iterator = numberarray[Symbol.iterator]()
console.log(iterator);

console.log(iterator.next().value);
console.log(iterator.next().value);
console.log(iterator.next().value);
console.log(iterator.next().value);
console.log(iterator.next().value);

//可以通过循环来执行
for (const n of iterator) {//当遍历完所有的值后iterator.next().value就会返回undefined
    console.log(n);
}

//entries,这都是数组身上的方法。
let entries = numberarray.entries();
console.log(entries.next().value);
console.log(entries.next().value);
console.log(entries.next().value);
console.log(entries.next().value);

for (const n of entries) {
    console.log(n);
}

//keys,values是一样的用法，我就不多赘述了。

//使用from方法
//Array.from可以根据已有的数组创建一个新的数组
let arr: number[] = Array.from(numberarray, (x) => x * 2)

//of方法,可以根据值创建一个数组
let arr4: number[] = Array.of(1, 2, 3, 4, 5)
//也可以用该方法复制一个数组
let arr5: number[] = Array.of(...arr4)


//fill方法可以填充数组,可以有三个参数，填充数，开始位置，结束位置。
let arr6: number[] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9).fill(1, 3, 5)

//sort()方法，排序，默认是升序。
//sort自定义排序，根据返回值排序
//这个地方是不是可以写成接口类型啊
interface Friend {
    name: string;
    age: number;
}
const friends: Friend[] = [
    {
        name: '张三',
        age: 18
    },
    {
        name: '李四',
        age: 20
    },
    {
        name: '王五',
        age: 19
    }
]
function compareage(a: Friend, b: Friend): number {
    if (a.age > b.age) {
        return 1
    }
    if (a.age < b.age) {
        return -1
    }
    return 0
}
console.log(friends.sort(compareage));

//字符串排序
let str: string[] = ['Ana', 'John', 'ana', 'john']
console.log(str.sort());

//不区分大小的排序,可以在sort里面用localeCompare方法。
console.log(str.sort((a, b) => a.localeCompare(b)));


//搜索
//indexof返回与参数匹配的索引
//找到了返回索引，没找到返回-1
//find和findIndex参数是接受一个回调，没找到返回值为undedined和-1
//includes返回布尔值，接受的是一个参数。
//这些实战的时候再用吧，特地拿出来举例感觉没有必要。

//转化为字符串 toString()和join()
let str1: string = numberarray.toString()//把数组里面的元素全部转化为字符串，用逗号隔开。
let str2: string = numberarray.join('-')//把数组里面的元素全部转化为字符串，用-隔开。
console.log(str1, str2);
//到此为止已经学完了数组上的方法。不定期进行复习。


